﻿
@{
    ViewBag.Title = "Index";
}

<h2>正则表达式测试(c#验证)</h2>
JavaScript 的正则不支持 “零宽度正回顾后发断言”
<style type="text/css">
    .red {
        color: #F00;
    }

    .green {
        color: #090;
    }
</style> 
<script type="text/javascript">
    /*

    .是另一个元字符，匹配除了换行符以外的任意字符。*同样是元字符，不过它代表的不是字符，也不是位置，而是数量——它指定*前边的内容可以连续重复使用任意次以使整个表达式得到匹配。因此，.*连在一起就意味着任意数量的不包含换行的字符。现在\bhi\b.*\bLucy\b的意思就很明显了：先是一个单词hi,然后是任意个任意字符(但不能是换行)，最后是Lucy这个单词

   *	重复零次或更多次
   +	重复一次或更多次
   ?	重复零次或一次
   {n}	重复n次
   {n,}	重复n次或更多次
   {n,m}	重复n到m次

   正则表达式里的分枝条件指的是有几种规则，如果满足其中任意一种规则都应该当成匹配，具体方法是用|把不同的规则分隔开.将会从左到右地测试每个条件，如果满足了某个分枝的话，就不会去再管其它的条件了

    \d+匹配1个或更多连续的数字。这里的+是和*类似的元字符，不同的是*匹配重复任意次(可能是0次)，而+则匹配重复1次或更多次。


   表3.常用的反义代码
   \W	匹配任意不是字母，数字，下划线，汉字的字符
   \S	匹配任意不是空白符的字符
   \D	匹配任意非数字的字符
   \B	匹配不是单词开头或结束的位置
   [^x]	匹配除了x以外的任意字符
   [^aeiou]	匹配除了aeiou这几个字母以外的任意字符

    */
    $(document).ready(function () {
        var Regex = /[^\d\.]/g;//不是数字和点的   /这之间是正则表达式/g
        Regex = /\(?0\d{2}\)?[- ]?\d{8}|0\d{2}[- ]?\d{8}/g;//电话号码
        Regex = /[abc]/g;//只要字符串里包含其中的一个字符，就通过 aeeeee通过 []里的只是一个占位符
        Regex = /1[abc]3/g;
        Regex = /[1-3]/g;//如果是数字 可指示范围，但是[]只是一个占位符，所以只表示一位数
        Regex = /\d\./g;//如果没有结尾符，后边可以任意写
        Regex = /http:\/{2}\w*\.\w.\w*/g;//自写的匹配网址的正则
        Regex = /[0-9]{6}[12][90]/g;//自写身份证匹配
        Regex = /^[0-9a-zA-Z]{6,15}$/g//用户名只能是6-15位的数字或字母组合

        Regex = /^[\w]{6,16}$/g;
        Regex = /^(?![0-9]+$)[0-9a-zA-Z]{6,15}$/g;//用户名只能是6-15位的数字和字母组合
        //Regex=/(?<='%).*?'.*?(?=/>|%')/g  //a like '%d%' or b like '%cc%'
        Regex = /^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/g; //ip地址
        Regex = /<img[^>]+>/g; //反义 匹配用尖括号括起来的以img开头的字符串。
        Regex = /\b(\w+)\b\s+\1\b/g;//后向引用  可以用来匹配重复的单词，像go go, 或者kitty kitty。
        //Regex=\b(?<Word>\w+)\b\s+\k<Word>\b; //自己指定子表达式的组名 此方法存疑,没有成功
        Regex = /\b\w+(?=ing\b)/g; //(?=exp)也叫零宽度正预测先行断言，它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b)，匹配以ing结尾的单词的前面部分(除了ing以外的部分)，如查找I'm singing while you're dancing.时，它会匹配sing和danc。必须ing结尾
        //Regex=/(?<=\bre)\w+\b/g;//(?<=exp)也叫零宽度正回顾后发断言，它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分)，例如在查找reading a book时，它匹配ading。
        // JavaScript 的正则不支持 “零宽度正回顾后发断言”
        //Regex=/\b\w*q(?!u)\w*\b/g;//(?!exp)负向零宽断言 它只匹配一个位置，并不消费任何字符 包含后面不是字母u的字母q的单词.同理，我们可以用(?<!exp),零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp：(?<![a-z])\d{7}匹配前面不是小写字母的七位数字

        //function chenck(s)
        //{
        //    var RegexStr=eval($("#regex").text());
        //    if(s.match(RegexStr)==null)
        //    {
        //  	  $("#msg").html("验证不通过！");
        //  	  $("#msg").removeClass("green");
        //  	  $("#msg").addClass("red");
        //    }
        //    else
        //    {
        //  	   alert(s.match(RegexStr))
        //  	   $("#msg").html("验证通过！");
        //  	   $("#msg").removeClass("red");
        //  	   $("#msg").addClass("green");
        //    }
        //}
        // // alert(eval(Regex))
        // $("#regex").text(eval(Regex));

        // $("#btn").click(function(){
        //     chenck($("#txt").val());
        //     });


        $("#btn").click(function () {
            SendData();
        }
            );

    });
    //用来转义URL中特殊字符的。
    function URLencode(sStr) {
        return (sStr).replace(/\+/g, '%2B').replace(/\"/g, '%22').replace(/\'/g, '%27').replace(/\//g, '%2F');
    }
    function SendData() {
        var  pattern = $("#regex").val();
        var input = $("#txt").val();
        var surl = URLencode('/Regex/RegexTest?input=' + input + '&pattern=' + pattern + '');
        alert(surl)
        $.ajax({
            url: surl,
            dataType: "json", // 使用jsonp格式
            success: function (data) {
                if(data.status==true)
                {
                    $("#msg").text("验证通过！表达式为:" + data.message);
                    $("#msg").removeClass("red");
                    $("#msg").addClass("green");
                }
                else
                {
                    $("#msg").text("验证不通过！表达式为:" + data.message+"");
                    $("#msg").removeClass("green");
                    $("#msg").addClass("red");
                }
            }
        });
    }


</script>
<style>
    div span {
        height: 30px;
        line-height: 30px;
        border: 1px solid #ccc bottom;
        padding: 5px;
    }

    .regexcss {
        font-size: 14px;
        font-weight:600;
        color: #FF5722;
    }
</style>


<div style="width:80%;padding:20px;border:1px solid #ccc">
    <div style="height:150px;">
        <span>
            表达式:
        </span>
        <span><textarea type="text" id="regex" class="regexcss" cols="80" rows="4" ></textarea></span>
    </div>
    <div style="height:50px;position:relative">
    <span>测试值:
        </span>
    <span><input type="text" id="txt" value="" size="50" />
        </span></div>
    <div style="height:50px;">
        <span>结果:</span><span id="msg"></span>
    </div><br>
    <input type="button" id="btn" value="点击测试">
</div>




